<?php
/**
 * @author Demianchuk Dmitro
 * @email d.demianchuk@gmail.com
 * @date 24.12.11
 * @version 1.0
 * @package adminArea.components.ATableEditor
 */
abstract class AActiveRecord extends CActiveRecord
{
	/**
	 * Возвращает конфигурацию полей для удаления
	 * @abstract
	 */
	abstract protected function getDeleteConfig();

	/**
	 * Метод меняет позицию строки в таблице в зависимости от переданных данных
	 * @return none
	 */
	public function upDownRow(){
		if(isset($_GET['up'])){
			$sql[0] = '<';
			$sql[1] = 'DESC';
			$id = (int)$_GET['up'];
		}elseif(isset($_GET['down'])){
			$sql[0] = '>';
			$sql[1] = 'ASC';
			$id = (int)$_GET['down'];
		}else{
			return;
		}
		$cur = $this->findByPk($id);
		if($cur!==null){
			$curPosition = $cur->position;
			$criteria = new CDbCriteria;
			$criteria->select = '`id`';
			$criteria->condition = 'position '.$sql[0].' :position';
			$criteria->order = '`position` '.$sql[1].'';
			$criteria->params=array(':position'=>$curPosition);
			$up = $this->model()->find($criteria);
			if($up!==null){
				$up = $this->findByPk($up->id);
				$curPosition = $cur->position;
				$cur->position = $up->position;
				$up->position = $curPosition;
				$up->save();
				$cur->save();
			}
		}
	}

	/**
	 * Метод показывает есть ли в таблице поле `position`
	 * @return bool
	 */
	public function isPosition(){
		$tableSchema = $this->getTableSchema();
		return isset($tableSchema->columns['position']);
	}

	/**
	 * Метод возвращает критерии вывода строк в гриде
	 * @return CDbCriteria
	 */
	protected function getGridCriteria(){
		$gridCriteria = new CDbCriteria();
		if($this->isPosition()){
			$gridCriteria->order = '`position` ASC';
		}
		return $gridCriteria;
	}

	/**
	 * Метод находит максимальное значение в таблице по указаному столбцу
	 * @param string $col - имя поля по которому будет производиться поиск
	 * @return mixed
	 */
	public function getMax($col='id'){
		$criteria = new CDbCriteria();
		$criteria->order = '`'.$col.'` DESC';
		$criteria->select = '`'.$col.'`';
		$max = $this->find($criteria);
		$max = $max[$col];
		return $max;
	}

	/**
	 * Удаляет запись с таблици и все с ней связанные поля
	 * @return bool
	 */
	public function deleteRow(){
		if(isset($_GET['delete'])){
			$transaction = Yii::app()->db->beginTransaction();
			try{
				$this->doDelete();
				$transaction->commit();
			}catch(Exception $e){
				echo $e->getMessage();
				$transaction->rollback();
				return false;
			}
		}else{
			return false;
		}
	}

	protected function doDelete($item=null){
		if($item===null){
			$item = $this->findAllByPk((int)$_GET['delete']);
			$item = $item[0];
		}
		$deleteConfig = $this->getDeleteConfig();
		foreach($deleteConfig AS $v){
			if(is_array($item->$v)){
				foreach($item->$v AS $vEl){
					$vEl->doDelete($vEl);
				}
			}else{
				if($item->$v!==null){
					$item->$v->doDelete($item->$v);
				}
			}
		}
		$item->delete();
	}
}
